package com.class05.ioc03;

import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;

import java.sql.SQLOutput;

@Controller
public class HelloController {

//    一、基于属性注入

//    情况1：注入类型为接口，且只有一个实现类
//    @Autowired  可以放在属性、set方法、构造方法、注解、参数上
//    boolean required() default true;
//    required属性，默认为true，表示必须注入成功，否则报错@NoSuchBeanDefinitionException
//    required=false，佛系装配，需要注意，后续对象是否有调用，如果有调用，则不会报错

//    参与自动装配的组件（需要装配、被装配）全部都必须在IoC容器中。
//    注意：不区分IoC的方式！XML和注解都可以！


//     情况2：注入类型为接口，且只有多个实现类

//    No qualifying bean of type 'com.class05.ioc03.HelloService' available: expected single matching bean but found 2: helloServiceImpl,newHelloServiceImpl
//    没有类型为“com.class05.ico03.HelloService”的合格bean可用：预期只有一个匹配的bean，但找到了2:helloServiceImpl，newHelloServiceImpl
//    解决方案1：修改自动装配的类型为具体的实现类
//    解决方案2：使用@Autowired+@Qualifier("helloServiceImpl")做精确装配
//    解决方案3：使用@Primary 注解标注一个实现类，优先装配
//    解决4：使用@Resource(name="helloServiceImpl")
//    相当于@Autowired + @Qualifier("helloServiceImpl")
    //    @Autowired(required = false)


//    name 是指定要装配的bean的id，默认为属性名，即helloService
    @Resource(name = "helloServiceImpl")
//    @Qualifier("helloServiceImpl")
//    @Qualifier("newHelloServiceImpl")

//    @Autowired 与 @Resource 的区别：
//    @Autowired 是Spring提供的，而@Resource是JDK提供的
    private HelloService helloService;

    public void print() {
        helloService.print();
    }

//    ================================
    private HelloService helloService2;

//    二、基于构造方法注入
    @Autowired
    public HelloController(HelloService helloService) {
        this.helloService2 = helloService;
    }

//    ================================
//    三、基于set方法注入
    private HelloService helloService3;
    @Autowired
    public void setHelloService3(HelloService helloService) {
        this.helloService3 = helloService;
    }




}
